module loader.scene.Mesh;

private {
	import loader.scene.Entity;
	import loader.scene.Material;
	import maths.CoordSys;
	import maths.Vec;
	import utils.Memory;
}



class Mesh : Entity {
	CoordSys	coordSys = CoordSys.identity;
	Material		material;
	
	
	
	// vertex indices and params
	final uint[]		indices() {
		return _indices;
	}
	
	final vec3[]		positions() {
		return _positions;
	}
	
	final vec3[]		normals() {
		return _normals;
	}
	final vec3[]		tangents() {
		return _tangents;
	}
	final vec3[]		bitangents() {
		return _bitangents;
	}
	
	final vec3[]	texCoords(int i) {
		return _texCoords[i];
	}
	
	final int numTexCoords() {
		return _texCoords.length;
	}
	
	final vec4[]		colors() {
		return _colors;
	}
	


	void allocIndices(int n) {
		_indices.alloc(n);
	}
	
	void allocPositions(int n) {
		_positions.alloc(n);
	}
	
	void allocNormals(int n) {
		_normals.alloc(n);
	}
	
	void allocTangents(int n) {
		_tangents.alloc(n);
	}
	
	void allocBitangents(int n) {
		_bitangents.alloc(n);
	}
	
	void allocTexCoords(int i, int n) {
		if (_texCoords.length <= i) _texCoords.alloc(i+1);
		_texCoords[i].alloc(n);
	}
	
	void allocColors(int n) {
		_colors.alloc(n);
	}
	
	
	
	~this() {
		_indices.free();
		_positions.free();
		_normals.free();
		_tangents.free();
		_bitangents.free();
		foreach (inout vec3[] tc; _texCoords) tc.free();
		_texCoords.free();
		_colors.free();
	}
	
	

	private {
		uint[]		_indices;
		
		vec3[]		_positions;
		
		vec3[]		_normals;
		vec3[]		_tangents;
		vec3[]		_bitangents;
		
		vec3[][]	_texCoords;
		
		vec4[]		_colors;
	}
}
